package com.example.common.utils;

import java.security.*;
import java.util.Base64;
import javax.crypto.Cipher;

public class RsaUtil {
    private static final String RSA = "RSA";
    
    /**
     * 生成一对私钥和公钥
     * @throws NoSuchAlgorithmException 如果Java运行时不支持“RSA”算法
     */
    public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
        KeyPairGenerator generator = KeyPairGenerator.getInstance(RSA);
        generator.initialize(2048);
        return generator.generateKeyPair();
    }
    
    /**
     * 根据给定的公钥加密给定的文本
     * @throws Exception 如果未找到加密算法“RSA”
     *                   如果不支持默认填充方案
     *                   如果给定的密钥无效（例如，为空或已损坏）
     *                   如果数据对于密钥大小而言过长
     *                   如果填充不匹配
     *                   如果纯文本或公钥为空
     */
    public static String encrypt(String plainText, PublicKey publicKey) throws Exception {
        Cipher encryptCipher = Cipher.getInstance(RSA);
        encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] cipherText = encryptCipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(cipherText);
    }
    
    /**
     * 根据给定的公钥解密给定的文本
     * @throws Exception 如果未找到加密算法“RSA”
     *                   如果不支持默认填充方案
     *                   如果提供的私钥无效
     *                   如果解密块大小不正确
     *                   如果数据填充不正确
     *                   如果文本或私钥为空
     */
    public static String decrypt(String cipherText, PrivateKey privateKey) throws Exception {
        byte[] bytes = Base64.getDecoder().decode(cipherText);
        Cipher decryptCipher = Cipher.getInstance(RSA);
        decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);
        return new String(decryptCipher.doFinal(bytes));
    }
}
